今天來介紹一個還蠻好用的 id 種類,Auto-increment 算是資料庫預設的 id 配置,十分簡單直覺。
但久了會發現一些小缺點,就是外部使用者其實是可以知道流水號目前編到哪裡?
有的時候會讓一些有心人士可以旁敲側擊知道一些系統的資訊,例如會員增長的速度、某些品項的商品數量之類的
這時候就蠻適合今天要推薦的這個 id~ hashids~~~~~ (請配樂老師幫我下多拉ㄟ夢掏出道具的音效 登登登登登~ ?)
看到 Hashids 的名字中的 hash,第一印象可能會是這東西會幫你把一串 id hash 成另一個看不懂的字串的感覺。但其實套件作者有說,這其實不是真正的雜湊,只是想要有雜湊的那個感覺而已。而且假如真的是 hash 的話,那所有的數字 id 都經過 hash 產生一個可以預期的結果,那其實還是可以逆推回原本的數字,就沒意義了。
所以 hashids 比較像是一種編碼,只是其他人不曉得背後的編碼規則,自然就無法得知背後的數字是多少了
另外一個額外的好處就是,一般我們使用 uuid 或是隨機亂數生成 id 的時候,它其實是沒有規律的,也沒辦法透過 id 去做排序,然後也有可能發生 id 碰撞 (說是風險很低不用擔心,但系統還是需要花時間檢查是否有重複 id?),但這個 hashids 的背後其實還是使用 Auto-increment ID,所以不用擔心碰撞的問題,可以放心使用。
很簡單進入 Hashids 官網之後點選你想使用的程式語言就可以找到對應的套件了。目前可支援 JavaScript, Ruby, Python, Java, Scala, PHP, Perl, Perl 6, Swift, Clojure, Objective-C, C, C++11, D, F#, Go, Erlang, Lua, Haskell, OCaml, Elixir, Rust, Smalltalk, ColdFusion, Kotlin, Nim, VBA, Haxe, Crystal, Elm, ActionScript, Bash, R, TSQL, PostgreSQL, PLpgSQL, Dart, Io, Julia, .NET 應該幾乎都涵蓋到了吧?
以下使用 JavaScript 舉例 (來自官網範例)
var hashids = new Hashids("this is my salt"),
id = hashids.encode(1, 2, 3),
numbers = hashids.decode(id);
首先透過 new Hashids(xxx)
來建立產生 hashid 的轉換器,裡面的 xxx 就是你所使用的鹽,作用跟密鑰差不多,一旦其他人知道你使用 hashids 也知道鹽的設定值,那他們就可以破解你的 hashids,所以使用的時候還是要注意不要讓 "this is my salt"
這段程式碼被其他人知道,千萬不要在前端頁面使用,因為前端沒有秘密可言。
至於後面的 encode(1,2,3)
應該看得出來是帶入數字,然後生成 hashid
然後 decode(hashid)
就是反向把 hashid 轉回當初的數字了
今天的分享到這裡,還剩下三天,我們明天再見~